跳到主要内容

Go 的 IO 接口及概念

Go 的 IO 库整理

io 基本的 IO 接口,属于底层接口定义库,其作用是是定义一些基本接口和一些基本常量,并对这些接口的作用给出说明,常见的接口有Reader、Writer等。一般用这个库只是为了调用它的一些常量,比如 io.EOF

ioutil 方便的 IO 操作函数集,包含在 io 目录下,它的主要作用是作为一个工具包,里面有一些比较实用的函数,比如 ReadAll(从某个源读取数据)、ReadFile(读取文件内容)、WriteFile(将数据写入文件)、ReadDir(获取目录)

fmt 格式化 IO,实现格式化 I/O,类似 C 语言中的 printf 和 scanf

os 库主要是跟操作系统打交道,所以文件操作基本都会跟 os 库挂钩,比如创建文件、打开一个文件等。这个库往往会和 ioutil 库、bufio 库等配合使用

bufio 可以理解为在 io 库上再封装一层,加上了缓存功能。它可以和 ioutil 结合使用

Linux 的文件权限

fmt.Println(os.FileMode(0660)) //-rw-rw----

开头使用 0 的表示这是一个 8 进制的数字

这边先整理,0-7 每个数字权限的意义。

0   没有任何权限
1 可以执行
2 可以写
3 可以写、可以执行
4 可以读
5 可以读、可以执行
6 可以读、可以写
7 可以读、可以写、可以执行

所以这个 0660 代表

  • 档案所有者可以有读写的权限
  • 群组用户可以有读写的权限
  • 其他用户没有任何权限

基本的 IO 接口

io 包为 I/O 原语提供了基本的接口。它主要包装了这些原语的已有实现。比较常用的接口有三个,分别是 Reader,Writer 和 Close。

// Read方法会接收一个字节数组p,并将读取到的数据存进该数组,最后返回读取的字节数n。
// 注意n不一定等于读取的数据长度,比如字节数组p的容量太小,n会等于数组的长度
type Reader interface {
Read(p []byte) (n int, err error)
}

// Write 方法同样接收一个字节数组p,并将接收的数据保存至文件或者标准输出等,返回的n表示写入的数据长度。
// 当n不等于len(p)时,返回一个错误。
type Writer interface {
Write(p []byte) (n int, err error)
}

// 关闭操作
type Closer interface {
Close() error
}

这个 Read 的用法(因为 io 库都是接口,所以这里拿 bufio 的为例):

reader := bufio.NewReader(conn)
var buf [128]byte
n, err := reader.Read(buf[:])

Reference

Go 中文网 - 输入输出 (Input/Output) os. OpenFile 的第三个参数 perm FileMode IO 操作库那么多,我咋选?谈谈对 Go IO 读写的困惑